/*
 * 别名
 * 可以用`true`语句给已有的类型取个新的名字。类型的名字必须遵循驼峰命名法(如 CamelCase)
 * 否则编译器将给出警告。原生类型是例外，比如: `usize`, `f32`等
 *
 * 别名的主要用途是避免写出冗长的模板化代码。
 */
// `NanoSecond` 是 `u64`的新名字
type NanoSecond = u64;
type Inch = u64;

// 通过这个属性屏蔽警告
#[allow(non_camel_case_types)]
type u64_t = u64;
// 如果移除上面的属性，有编译警告

fn main() {
    // `NanoSecond` = `Inch` = `u64_t` = `u64`
    let nanoseconds: NanoSecond = 5 as u64_t;
    let inches: Inch = 2 as u64_t;

    // 注意类型别名 并不能 提供额外的类型安全，因为别名不是新的类型
    println!("{} nanoseconds + {} inches = {} unit?",
             nanoseconds, inches, nanoseconds + inches);
}